package com.cskaoyan._03innerclazz._04local._02basic;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/13 15:19
 **/
/*
局部内部类与外部类的关系?
    把局部内部类当做外部类的一个局部变量理解

局部内部类访问特点
    内部类----->外部类
        成员方法:
            可以直接通过成员名去访问
            通过this.访问内部类成员
            通过类名.this.访问的外部类成员
        静态方法:
            需要先创建外部类对象,通过对象.访问
        不受权限控制
    外部类----->内部类
        成员方法: 作用域内创建内部类对象,通过对象.去访问
        静态方法: 作用域内创建内部类对象,通过对象.去访问
        不受权限的影响
    内部类----->外部其他类
        创建外部其他类对象,通过对象.访问
        受访问权限控制
 */
public class Demo {
    int a  =1;
    private int b = 2;
    public static void main(String[] args) {

    }
}

// 外部类
class Outer{
    // 成员变量
    int a  = 1;
    private String s = "zs";
    static int b = 2;


    // 外部类的成员方法
    public void outerMethod() {
        // 局部位置
        // 局部内部类
        class Inner{
            // 内部类成员
            private int aa = 10;
            int a = 11;
            void innerMethod() {
                // 内部类----->外部类
                // 直接通过成员名去访问
                // 访问外部类成员变量
                // 如果出现同名的情况
                // 通过this.访问的是局部内部类的成员
                System.out.println(this.a);
                // 通过类名.this.访问外部类的同名成员
                System.out.println(Outer.this.a);
                System.out.println(s);

                // 访问外部类的成员方法
                outerMethod2();

                // 访问外部类的静态成员
                System.out.println(Outer.b);
                Outer.outerStaticMethod2();

            }
            void innerMethod2() {
                // 内部类---->外部其他类
                // 创建外部其他类的对象
                Demo demo = new Demo();

                // 通过对象.访问
                System.out.println(demo.a);
                //System.out.println(demo.b);
            }


        }

        // 外部类----->内部类
        // 在作用域内
        // 创建局部内部类对象
        Inner inner = new Inner();
        // 通过对象.访问
        System.out.println(inner.aa);
        System.out.println(inner.a);
        inner.innerMethod2();
    }

    // 外部类成员方法
    public void outerMethod2() {

    }

    // 外部类的静态方法
    public static void  outerStaticMethod() {
        // 局部位置
        class Inner2{
            int a = 1;
            int b = 2;

            void innerMethod() {
                // 内---->外
                //System.out.println(Outer.this.a);
                //System.out.println(s);
                // 创建外部类对象,通过对象.访问
                Outer outer = new Outer();
                // 访问外部类的成员变量
                System.out.println(outer.a);
                // private也可以
                System.out.println(outer.s);
                System.out.println(Outer.b);
                // 访问成员方法
                outer.outerMethod2();
            }

            void innerMethod2() {
                // 内部类--->外部其他类
                Demo demo = new Demo();
                System.out.println(demo.a);
            }
        }

        // 外---> 内
        // 创建内部类对象,通过对象.访问
        Inner2 inner2 = new Inner2();
        System.out.println(inner2.a);
        System.out.println(inner2.b);

        inner2.innerMethod2();

    }

    // 外部类的静态方法
    public static void  outerStaticMethod2() {

    }

}